// import { ElMention, ElMessage } from "element-plus";
// import Nifi from "../nifi";
// import { FlowKeys } from "../util";
// import { useDebounceFn } from "@vueuse/core"
// import { Cell } from "pack-antv-x6"

// export default (nifi: Nifi) => {
//     // 初始化 flow
//     const getClientId = async () => await nifi.api.get('/nifi-api/flow/client-id');
//     const getProcessorTypes = async () => (await nifi.api.get('/nifi-api/flow/processor-types')).processorTypes;
//     const getControllerServiceTypes = async () => (await nifi.api.get('/nifi-api/flow/controller-service-types')).controllerServiceTypes;
//     const getReportingTaskTypes = async () => (await nifi.api.get('/nifi-api/flow/reporting-task-types')).reportingTaskTypes;
//     const getParameterProviderTypes = async () => (await nifi.api.get('/nifi-api/flow/parameter-provider-types')).parameterProviderTypes;
//     const getPrioritizerTypes = async () => (await nifi.api.get('/nifi-api/flow/prioritizers')).prioritizerTypes;
//     const getParameterContexts = async () => (await nifi.api.get('/nifi-api/flow/parameter-contexts')).parameterContexts;
//     const initFlow = async () => {
//         const [clientId, processorTypes, controllerServiceTypes, reportingTaskTypes, parameterProviderTypes, prioritizerTypes, parameterContexts] = await Promise.all([getClientId(), getProcessorTypes(), getControllerServiceTypes(), getReportingTaskTypes(), getParameterProviderTypes(), getPrioritizerTypes(), getParameterContexts()])
//         nifi.flow.clientId = clientId;
//         nifi.flow.processorTypes = processorTypes;
//         nifi.flow.controllerServiceTypes = controllerServiceTypes;
//         nifi.flow.reportingTaskTypes = reportingTaskTypes;
//         nifi.flow.parameterProviderTypes = parameterProviderTypes;
//         nifi.flow.prioritizerTypes = prioritizerTypes;
//         nifi.flow.parameterContexts = parameterContexts;
//     }

//     const initBreadcrumb = (data: any, cid?: string) => {
//         const { breadcrumb, parentBreadcrumb } = data
//         const { id, name } = breadcrumb;
//         const res: any = {};
//         const ids = [id]
//         res[id] = cid ? { name, id, next: cid } : { name, id }
//         if (parentBreadcrumb) {
//             res[id].prev = parentBreadcrumb.id
//             const [t,ts] = initBreadcrumb(parentBreadcrumb, breadcrumb.id)
//             Object.assign(res, t);
//             ids.push(...ts)
//         }
//         return [res,ids];
//     }

//     // 刷新 parameter Context
//     const refreshParameterContexts = async () => {
//         const res = await getParameterContexts();
//         nifi.flow.parameterContexts = res;
//     }
//     //
//     const refreshControllerServiceTypes = async () => {
//         const res = await getControllerServiceTypes();
//         nifi.flow.controllerServiceTypes = res;
//     }
//     // 初始化 groups
//     const initGroup = async (id = nifi.group.id || nifi.rootId) => {
//         const get = nifi.api.get;
//         const fu = `/nifi-api/flow/process-groups/${id}?uiOnly=true`
//         const du = `/nifi-api/process-groups/${id}?uiOnly=true`
//         //
//         try {
//             const [{ processGroupFlow }, data] = await Promise.all([get(fu), get(du)])
//             Object.assign(nifi.group, data)
//             nifi.group.flow = processGroupFlow.flow;
//             // nifi.group.breadcrumb = processGroupFlow.breadcrumb;
//             const [d,ids] = initBreadcrumb(processGroupFlow.breadcrumb)
//             nifi.group.breadcrumb = d;
//             nifi.group.breadcrumbIds = ids;
//             // 坐标解析 和配置参数还原
//             parsePosition();
//             // nifi.graphPosition();
//             //
//             console.log('...initGroup..........',nifi.graphConfig.x,nifi.graphConfig.y)
//             return true;
//         } catch (error) {
//             ElMessage.error('获取画布数据失败 :: ' + error);
//             console.error(error)
//             return false;
//         }
//     }

//     const updateGroupData = (td: any = {}) => {
//         Object.assign(nifi.group, td)
//     }

//     // 渲染图数据
//     const initGraphData = () => {
//         if (nifi.graph == undefined || nifi.group.flow == undefined) { return; }
//         // 构造数据
//         const mds = []
//         for (const k of FlowKeys) {
//             // @ts-ignore
//             const cs: any[] = nifi.cellApi[k as IPackNifi.NIFI_CAMEL_NAME]?.init(nifi.group.flow[k], mds) || [];
//             mds.push(...cs);
//         }
//         // 布局
//         const cells = nifi.cellApi.layout(mds)
//         // 渲染
//         nifi.graph.fromJSON(cells)
//         //
        
//     }
//     // 增量渲染
//     const addGraphData = (flow: any) => {
//         const mds = []
//         for (const k of FlowKeys) {
//             // @ts-ignore
//             const cs: any[] = nifi.cellApi[k as IPackNifi.NIFI_CAMEL_NAME]?.init(flow[k], mds) || [];
//             mds.push(...cs);
//         }
//         for (const md of mds) {
//             nifi.graph?.addCell(md);
//         }
//     }
//     // 刷新画布
//     const refresh = async (id?: string) => {
//         if (await initGroup(id)) {
//             initGraphData();
//         }
//     }
//     // 刷新节点以及节点的出边
//     const refreshNode = async () => {}

//     //
//     const removeCell = (cell:Cell) => {
//         nifi.delCellData(cell)
//         nifi.graph?.removeCell(cell)
//     }
//     // 跳转到指定 group 的 cell
//     const goToCell = async (groupId:string,id:string) => {
//         if(groupId != nifi.group.id){
//             await refresh(groupId);
//         }
//         nifi.centerCell(id);
//         nifi.graph?.resetSelection(id)
//     }
//     // 转到 HOME 
//     const goHome = async () => {
//         refresh(nifi.rootId)
//     }
//     // 更新画布坐标
//     const updatePosition = async () => {
//         if(!nifi.group.id) return ;
//         const { x, y, scale, edge } = nifi.graphConfig;
//         const position = { x: Number(`${Math.round(x * 100)}.${scale}01`), y: Number(`${Math.round(y * 100)}.${edge}01`) }
//         const data = { component: { id: nifi.group.id, position }, revision: nifi.group.revision, disconnectedNodeAcknowledged: false };
//         const url = `/nifi-api/process-groups/${nifi.group.id}`;
//         //
//         try {
//             const res = await nifi.api.put(url,data);
//             updateGroupData(res);
//         } catch (error) {
//             ElMessage.error('更新画布数据失败 :: ' + error);
//             console.error(error)
//         }
//     }
//     // 解析画布坐标
//     const parsePosition = () => {
//         const { x, y } = nifi.group.position;
//         const [sx, sc] = String(x).slice(0,-2).split('.')
//         const [sy, se] = String(y).slice(0,-2).split('.')
//         if (sx && sy && sc && se != undefined) {
//             nifi.graphConfig.x = Number(sx) / 100;
//             nifi.graphConfig.y = Number(sy) / 100;
//             nifi.graphConfig.scale = Number(sc);
//             nifi.graphConfig.edge = Number(se);
//         }
//     }
//     //
//     nifi.onMounted((graph) => {
//         initGraphData();
//         //
//         graph.on('translate', useDebounceFn(() => {
//             updatePosition();
//         }, 500))
//     })

//     //
//     return { refresh,goToCell,goHome,removeCell, refreshParameterContexts,refreshControllerServiceTypes, initGraphData, updateGroupData, initGroup, initFlow, addGraphData };
// }